<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    /* 
    产生闭包的条件
        1. 函数嵌套
        2. 内部函数引用了外部函数的局部变量
        3. 调用外部
    什么时候创建? 
        执行内部函数定义, 也就是创建内部函数对象
    闭包是什么?  结论是通过chrome的debug调试知道的
        是包含了被引用变量的一个容器(不是js对象), 被内部函数对象引用着
        fn2 ==> 内部函数对象 ==> 闭包
    如何使用闭包? / 如何让闭包在执行完函数后还能存活下来?
        返回内部函数, 在外部接收    最常用的手段
        用其它不会立即释放的变量引用内部函数对象  setTimeout(() => {})
    闭包的作用?
        延长局部变量的生命周期
        让函数外部能间接操作内部的局部变量
    区别闭包的三个操作
        产生闭包:  内部函数对象创建时产生, 包含那个被引用的变量的容器对象(js对象)
        使用闭包: 执行内部函数
        释放闭包: 让内部函数对象成为垃圾对象, 断开指向它的所有引用
    闭包的应用?
        具体功能说: 可以说根据id删除品牌(需要显示确定框)
        大的说: 我们定义的很多模块在编译后的代码中都存在闭包
    
    */

    function fn1() {
      var a = 2
      var b = []
      function fn2() {
        a++
        console.log(a, b)
      }
      return fn2
    }
    var fn = fn1()
    fn() // 3
    fn() // 4
    fn() // 5

    fn = null

    /* 
    函数内部的局部变量的生命周期?
      调用函数产生, 调用结束自动释放
    */

    function showDelay(msg, time) {
      setTimeout(() => {
        console.log(msg)
      }, time);
    }
    showDelay('abc', 2000)
  </script>
</body>
</html>